﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace SatisGonderim
{
    public class HareketUst
    {
        List<HareketDetay> _lines = new List<HareketDetay>();
        Decimal[] matrahlar = new decimal[10];
        Decimal[] kdvTutarlari = new decimal[10];

        public decimal[] KdvMatrahlari { get { return matrahlar; } }
        public decimal[] KdvTutarlari { get { return kdvTutarlari; } }
        public int FisNo { get; set; }
        public int LineNo { get; set; }
        public int KasaNo { get; set; }
        public int KasaSiraNo
        {
            get
            {
                string[] eslemeler = Sessions.Get[Settings.kasaEsleme].ToString().Split(',');
                if (eslemeler.Length > 0)
                {
                    foreach (var item in eslemeler)
                    {
                        string kasaNo = item.Split('=')[0];
                        string siraNo = item.Split('=')[1];

                        if (KasaNo.ToString() == kasaNo)
                        {
                            return Cevir.Parse<int>(siraNo);
                        }
                    }
                }
                return 0;
            }
        }
        public int MagazaNo { get; set; }
        public bool Iptal { get; set; }
        public string BelgeNo { get; set; }
        public byte BelgeTipi { get; set; }
        public DateTime Tarih { get; set; }
        public DateTime BitisTarihi { get; set; }
        public decimal Tutar { get; set; }
        public decimal NakitOdeme { get; set; }
        public decimal KrediKartiOdeme { get; set; }
        public string CariKodu { get; set; }
        public List<HareketDetay> Satirlar { get { return _lines; } }
        public string Seri { get; set; }
    }

    public class HareketDetay
    {
        public int KdvDepartmani { get; set; }
        public decimal KdvOrani { get; set; }
        public decimal Miktar { get; set; }
        public decimal BirimFiyat { get; set; }
        public decimal Tutar { get; set; }
        public decimal KdvTutari { get; set; }
        public string Barkodu { get; set; }
        public int LineNo { get; set; }
        public string StokKodu { get; set; }
    }

    public class Aktarim
    {
        Mikro mk = new Mikro();

        public void Start(DateTime tarih)
        {
            string path = Sessions.Get[Settings.GeniusTransFolder].ToString();
            if (Directory.Exists(path))
            {
                try
                {
                    string[] files = Directory.GetFiles(path, "GNETR*.LOG");
                    if (files.Length > 0)
                    {
                        int fissayisi = 0;
                        decimal fisciro = 0;
                        int iadesayisi = 0;
                        decimal iadeciro = 0;

                        foreach (string file in files)
                        {
                            int kasaNo = Cevir.Parse<int>(file.Substring(file.Length - 12).Substring(5, 3));
                            int sonfis = mk.SonFisNo(tarih, kasaNo);
                            int sonsatir = mk.SonSatirNo(tarih, kasaNo);

                            var liste = ReadSaleFile(file, tarih, sonsatir);
                            mk.SatisEkle(tarih, liste.Where(x => x.FisNo > sonfis).ToArray());

                            fissayisi += liste.Where(x => x.BelgeTipi < 2).Count();
                            iadesayisi += liste.Where(x => x.BelgeTipi == 2).Count();
                            fisciro += liste.Where(x => x.BelgeTipi < 2).Select(x => x.Tutar).Sum();
                            iadeciro += liste.Where(x => x.BelgeTipi == 2).Select(x => x.Tutar).Sum();
                        }

                        mk.MagazaCiroGuncelle(tarih, fissayisi, iadesayisi, fisciro, iadeciro);
                    }

                }
                catch (Exception ex)
                {
                    Logging.GetLog.ErrorLog(ex);
                }
            }
            else
            {
                Logging.GetLog.ErrorLog(new Exception("Trans Klasörü girilmemiş !"));
            }
        }

        public decimal GunlukCiro(DateTime tarih)
        {
            decimal ciro = 0;
            string path = Sessions.Get[Settings.GeniusTransFolder].ToString();
            if (Directory.Exists(path))
            {
                try
                {
                    string[] files = Directory.GetFiles(path, "GNETR*.LOG");
                    foreach (string file in files)
                    {
                        int kasaNo = Cevir.Parse<int>(file.Substring(file.Length - 12).Substring(5, 3));
                        ciro = ReadSaleFile(file, tarih, 0).Select(x => x.Tutar).Sum();
                    }
                }
                catch (Exception ex)
                {
                    Logging.GetLog.ErrorLog(ex);
                }
            }
            else
            {
                Logging.GetLog.ErrorLog(new Exception("Trans Klasörü girilmemiş !"));
            }
            return ciro;
        }

        public void OncekiGunSatisi(DateTime tarih, string filename)
        {
            if (File.Exists(filename))
            {
                var liste = ReadSaleFile(filename, tarih, 0).ToArray();
                mk.SatisEkle(tarih, liste);
            }
        }


        public void OncekiGunSatisi(DateTime tarih)
        {
            string path = Sessions.Get[Settings.GeniusBackupFolder].ToString();
            if (Directory.Exists(path))
            {
                try
                {
                    string filename = path + "\\gn" + tarih.Year.ToString() + tarih.Month.ToString("00") + tarih.Day.ToString("00") + ".log";
                    OncekiGunSatisi(tarih, filename);
                }
                catch (Exception ex)
                {
                    Logging.GetLog.ErrorLog(ex);
                }
            }
            else
            {
                Logging.GetLog.ErrorLog(new Exception("Trans Klasörü girilmemiş !"));
            }
        }

        public List<HareketUst> ReadSaleFile(string fileName, DateTime tarih, int sonsatir)
        {
            List<HareketUst> lines = new List<HareketUst>();
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (StreamReader sr = new StreamReader(fs))
                {
                    bool basla = false;
                    string date = tarih.Year.ToString() + tarih.Month.ToString("00") + tarih.Day.ToString("00");
                    string line = "";
                    HareketUst ust = null;
                    int satir = 0;
                    while (sr.Peek() > -1)
                    {
                        line = sr.ReadLine();

                        if (!string.IsNullOrEmpty(line))
                        {
                            if (line.Substring(19, 2) == "RH" && line.Substring(32, 8) == date)
                            {
                                basla = true;
                            }
                        }


                        if (basla)
                        {
                            if (!string.IsNullOrEmpty(line))
                            {
                                switch (line.Substring(19, 2))
                                {
                                    case "RH": //fiş başı
                                        satir = 0;
                                        ust = new HareketUst();
                                        ust.FisNo = Cevir.Parse<int>(line.Substring(0, 6));
                                        ust.LineNo = Cevir.Parse<int>(line.Substring(6, 4));
                                        ust.KasaNo = Cevir.Parse<int>(line.Substring(10, 3));
                                        ust.MagazaNo = Cevir.Parse<int>(line.Substring(13, 6));
                                        ust.Iptal = Cevir.Parse<bool>(line.Substring(21, 1));
                                        ust.Tarih = line.Substring(32, 14).toDate();
                                        ust.BitisTarihi = line.Substring(46, 14).toDate();
                                        ust.BelgeTipi = Cevir.Parse<byte>(line.Substring(70, 1));
                                        ust.Tutar = line.Substring(75, 15).toDecimal();
                                        ust.CariKodu = "";
                                        ust.BelgeNo = "";
                                        break;
                                    case "IS":
                                        if (line.Substring(21, 1) == "1") //iptal satır
                                        {
                                            string barkod = line.Substring(85, 24).Trim();
                                            decimal miktar = Cevir.Parse<decimal>(line.Substring(32, 6));
                                            if (line.Substring(38, 1) == "1")
                                            {
                                                miktar = miktar / 1000m;
                                            }

                                            var hr = ust.Satirlar.Where(x => x.Barkodu == barkod).ToList();
                                            List<HareketDetay> sil = new List<HareketDetay>();
                                            foreach (HareketDetay item in hr)
                                            {
                                                if (item.Miktar <= miktar)
                                                {
                                                    sil.Add(item);
                                                    miktar -= item.Miktar;
                                                }
                                                else
                                                {
                                                    item.Miktar -= miktar;
                                                    break;
                                                }
                                            }

                                            foreach (var item in sil)
                                            {
                                                ust.Satirlar.Remove(item);
                                            }
                                        }
                                        else //normal satırı
                                        {
                                            HareketDetay dt = new HareketDetay();
                                            dt.KdvDepartmani = Cevir.Parse<int>(line.Substring(28, 2));
                                            dt.KdvOrani = Cevir.Parse<decimal>(line.Substring(30, 2));
                                            dt.Miktar = Cevir.Parse<decimal>(line.Substring(32, 6));
                                            if (line.Substring(38, 1) == "1")
                                            {
                                                dt.Miktar = dt.Miktar / 1000m;
                                            }
                                            dt.BirimFiyat = line.Substring(39, 15).toDecimal();
                                            dt.Tutar = line.Substring(54, 15).toDecimal() / ((dt.KdvOrani + 100m) / 100m);
                                            dt.KdvTutari = line.Substring(54, 15).toDecimal() - (line.Substring(54, 15).toDecimal() / ((dt.KdvOrani + 100m) / 100m));
                                            dt.Barkodu = line.Substring(85, 24).Trim();
                                            dt.StokKodu = mk.StokKodu(dt.Barkodu);
                                            dt.LineNo = satir;
                                            ust.KdvMatrahlari[dt.KdvDepartmani] += line.Substring(54, 15).toDecimal() / ((dt.KdvOrani + 100m) / 100m);

                                            if (dt.KdvDepartmani > 0)
                                                ust.KdvTutarlari[dt.KdvDepartmani - 1] += dt.KdvTutari;

                                            ust.Satirlar.Add(dt);
                                        }

                                        satir++;
                                        break;
                                    case "PY":
                                        if (line.Substring(125, 2) == "99")
                                        {
                                            if (line.Substring(24, 2) == "01") //kredi
                                            {
                                                ust.KrediKartiOdeme += line.Substring(26, 15).toDecimal();
                                            }
                                            else
                                            {
                                                ust.NakitOdeme += line.Substring(26, 15).toDecimal();
                                            }
                                        }
                                        else if (line.Substring(125, 2) == "00")
                                        {
                                            if (line.Substring(24, 2) == "01") //kredi
                                            {
                                                ust.KrediKartiOdeme -= line.Substring(26, 15).toDecimal();
                                            }
                                            else
                                            {
                                                ust.NakitOdeme -= line.Substring(26, 15).toDecimal();
                                            }
                                        }
                                        else
                                        {
                                            ust.NakitOdeme += ust.Tutar;
                                        }
                                        break;
                                    case "VF":
                                        //ust.KdvDep1Tutari = line.Substring(24, 15).toDecimal();
                                        //ust.KdvDep2Tutari = line.Substring(40, 15).toDecimal();
                                        //ust.KdvDep3Tutari = line.Substring(55, 15).toDecimal();
                                        //ust.KdvDep4Tutari = line.Substring(70, 15).toDecimal();
                                        //ust.KdvDep5Tutari = line.Substring(85, 15).toDecimal();
                                        break;
                                    case "DF":
                                        //ust.KdvDep1Matrahi = line.Substring(24, 15).toDecimal();
                                        //ust.KdvDep2Matrahi = line.Substring(40, 15).toDecimal();
                                        //ust.KdvDep3Matrahi = line.Substring(55, 15).toDecimal();
                                        //ust.KdvDep4Matrahi = line.Substring(70, 15).toDecimal();
                                        //ust.KdvDep5Matrahi = line.Substring(85, 15).toDecimal();
                                        lines.Add(ust);
                                        break;
                                }
                            }
                        }

                    }
                    sr.Close();
                }
                fs.Close();
            }
            return lines;
        }
    }
}
